package com.xplay.xpocker.room.mahjong;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;

import javax.annotation.PostConstruct;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 注意 这个类 里面提供了一些 子类使用的公共方法
 * <p>
 * <p>
 * AbstractRoom<MahjongRoomRule, MahjongRoomInfo,GameRuMahjongLogs>  这个房间信息不能设置为当前类变量 会出现并发问题
 * getRoomInfo()  获取当前房间信息  这里是存储到线程副本的
 */

public abstract class AbstractMahjongMessageStrategy<T, R> extends AbstractMahjongAction {

    @Autowired
    public ApplicationEventPublisher applicationEventPublisher;

    protected abstract String strategyName();


    @PostConstruct
    public void registerFactory() {
        messageHandler.put(strategyName(), this);
    }

    public static final ConcurrentHashMap<String, AbstractMahjongMessageStrategy> messageHandler = new ConcurrentHashMap<>();


    /**
     * 这里返回boolean值   是为了判断是否<>版本号</>变更
     * <p>
     * 注意这里的版本号不是乐观锁
     * <p>
     * 为了让客户端和服务器的内容达到 一致
     * 为什么不使用乐观锁  因为存在静默行为
     * 具体看看  MessageContent  的解释
     *
     * @param roomInfo
     * @param messageInfo
     * @return
     */
    public abstract boolean doMessage(T roomInfo, R messageInfo);

}
